home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
GameStar 2006 February
/
Gamestar_81_2006-02_dvd.iso
/
Red Shark
/
Missions
/
Mission_2
/
MissionTasks.script
< prev
next >
Wrap
Text File
|
2001-12-24
|
17KB
|
788 lines
//-------------------------------------------------------------------
//
// This code is copyright 2001 by G5 Software.
// Any unauthorized usage, either in part or in whole of this code
// is strictly prohibited. Violators WILL be prosecuted to the
// maximum extent allowed by law.
//
//-------------------------------------------------------------------
///////////////////////////////////
//
// Mission 2. "Convoy"
//
//
//
// *** mission AI controller ***
//
class CConvoyMission_AIController extends CBaseAIController
{
boolean PlatoonAIsAttacks = false;
boolean PlatoonBIsAttacks = false;
boolean PlatoonAIsMoving = false;
boolean PlatoonBIsMoving = false;
void OnObjectEnterArea( int _NavPointIndex, string _NavPointName, string _ObjectID)
{
if ( _NavPointName == "NavPoint_Destination"
&& Core_IsStringStartsWith( _ObjectID, "SovietTruck_Transport"))
{
// Mission accomplished
Core_BroadcastEvent("OnTransportsEnteredDestinationZone");
};
if ( _NavPointName == "NavPoint_Ambush_1"
&& ( Core_IsStringStartsWith( _ObjectID, "SovietTruck_Transport")))
//|| Core_IsStringStartsWith( _ObjectID, "Helicopter") ) )
{
// Convoy entered ambush 1 back attack zone
/*
Core_SendEventTo(
"NaziTank_Ambusher_1 1",
"OnAttackConvoy");
Core_SendEventTo(
"NaziTank_Ambusher_1 2",
"OnAttackConvoy");
*/
Core_BroadcastEvent( "OnAttackConvoy_1");
}
if ( _NavPointName == "NavPoint_Ambush_2"
&& Core_IsStringStartsWith( _ObjectID, "SovietTruck_Transport"))
{
// Convoy entered ambush 2 back attack zone
/*
Core_SendEventTo(
"NaziTank_Ambusher_2 1",
"OnAttackConvoy");
Core_SendEventTo(
"NaziTank_Ambusher_2 2",
"OnAttackConvoy");
*/
Core_BroadcastEvent( "OnAttackConvoy_2");
}
if ( _NavPointName == "NavPoint_Ambush_1"
&& Core_IsStringStartsWith( _ObjectID, "SovietTruck_Transport") && !PlatoonAIsMoving)
{
PlatoonAIsMoving = true;
Core_BroadcastEvent("Attack_A");
}
if ( _NavPointName == "NavPoint_Ambush_2"
&& Core_IsStringStartsWith( _ObjectID, "SovietTruck_Transport") && !PlatoonBIsMoving)
{
PlatoonBIsMoving = true;
Core_BroadcastEvent("Attack_B");
}
if ( _NavPointName == "NavPoint_PatrolA"
&& Core_IsStringStartsWith( _ObjectID, "NaziTank_AttackA") && !PlatoonAIsAttacks)
{
PlatoonAIsAttacks = true;
Core_BroadcastEvent("AttackTarget_A");
}
if ( _NavPointName == "NavPoint_PatrolB"
&& Core_IsStringStartsWith( _ObjectID, "NaziTank_AttackB") && !PlatoonBIsAttacks)
{
PlatoonBIsAttacks = true;
Core_BroadcastEvent("AttackTarget_B");
}
}
}
//
// *** Autocade ***
//
// soviet transports convoy
class CConvoyMission_SovietTruck_ConvoyTransport extends CBaseAITask_BaseTask, CNavPointUser
{
//
// convoy parameters
vector DestinationPoint = GetNavPoint("NavPoint_Destination");//vector( 474 * 8, 1883 * 8, 0); // where to go
float CruiserSpeed = 22; // autocade with guard should keep this speed
float RunSpeed = 28; // autocade wo guards should keep this speed
float OvertakeSpeed = 34; // maximum allowed speed for overtake
float AutocadDistanceMin = 20; // nearest allowed distance in autocade
float AutocadDistanceOptimum = 25; // try to keep this distance in autocade
float AutocadDistanceOvertake = 40; // overtake distance
float DisperceRadius = 50;
string CurLeader = "";
boolean IsLeader = false;
//
// current state
boolean Moving = false; // true when object is moving to destination
boolean Ambushed = false; // true when object is under ambush
boolean Run = false; // true when object is running without stop to destination
void ClearState()
{
Moving = false;
Ambushed = false;
Run = false;
CurLeader = "";
IsLeader = false;
}
//
// start up initialization
void Init()
{
// give start order
GiveOrder_MoveToTarget();
}
//
// orders
void GiveOrder_MoveToTarget()
{
//Core_LogMessage("" + Core_GetIdentificator() + ": order: move to target");
SetFireStyle_NoFire();
string Leader = GetCommander("Convoy_Rank"); // find leader that we should followed by
if ( Moving == true
&& Leader == CurLeader)
{
// nothing changed
return;
}
// set state
ClearState();
Moving = true;
CurLeader = Leader;
if ( Leader == "")
{
// we are leader. go directly to destination
SetOrder_MoveTo(
DestinationPoint,
CruiserSpeed);
}
else
{
// leader found. follow him
SetOrder_Follow(
Leader, // follow leader
AutocadDistanceMin,
AutocadDistanceOptimum,
AutocadDistanceOvertake,
CruiserSpeed,
OvertakeSpeed);
};
}
void GiveOrder_RunToTarget()
{
//Core_LogMessage("" + Core_GetIdentificator() + ": order: run to target");
string Leader = GetCommander("Convoy_Rank"); // find leader that we should followed by
if ( Run == true
&& Leader == CurLeader)
{
// nothing changed
return;
}
// set state
ClearState();
Run = true;
CurLeader = Leader;
if ( Leader == "")
{
// we are leader. go directly to destination
SetOrder_MoveTo(
DestinationPoint,
RunSpeed);
}
else
{
// leader found. follow him
SetOrder_Follow(
Leader, // follow leader
AutocadDistanceMin,
AutocadDistanceOptimum,
AutocadDistanceOvertake,
RunSpeed,
OvertakeSpeed);
};
}
void GiveOrder_Disperse()
{
//Core_LogMessage("" + Core_GetIdentificator() + ": order: disperce");
// set state
ClearState();
Ambushed = true;
SetOrder_StopNow();
/*
string Leader = GetCommander("Convoy_Rank"); // find leader that we should followed by
if ( Leader == "")
{
SetOrder_StopNow();
}
*/
/*
// move to random point
SetOrder_MoveTo(
GetNowPosition() + vector( rand(DisperceRadius), rand(DisperceRadius), 0.0),
OvertakeSpeed);
*/
}
//
// events
void OnToDamage(
float _DamageRate,
string _TargetId,
string _SourceType,
matrix _SourcePlace)
{
Core_LogMessage("" + Core_GetIdentificator() + ": OnToDamage");
//string EnemyID = GetTargetedEnemy();
// report ambush
Core_BroadcastEvent("OnAmbush");
}
void OnEnemyTargeted()
{
//#TMP: do not look for enemies
/*
//Core_LogMessage("" + Core_GetIdentificator() + ": OnEnemyTargeted");
//string EnemyID = GetTargetedEnemy();
// report ambush
Core_BroadcastEvent("OnAmbush");
*/
}
void OnNoEnemy()
{
//Core_LogMessage("" + Core_GetIdentificator() + ": OnNoEnemy");
if ( Run == true)
return;
if ( Ambushed
&& GetCommander("Convoy_Rank") == "")
{
// end ambush when commander see no enemy on radar
Core_BroadcastEvent("OnEndAmbush");
}
}
void OnLeaderLost( string _LeaderID)
{
if ( Moving)
{
GiveOrder_MoveToTarget();
}
if ( Run)
{
GiveOrder_RunToTarget();
}
}
void OnUpdate()
{
/*
Core_LogMessage("" + Core_GetIdentificator() + ": OnUpdate");
if ( Retreat == true)// || Run == true)
return;
Core_LogMessage("" + Core_GetIdentificator() + ": OnUpdate: state passed");
*/
if ( GetGroupObjectsNum("Guard_Rank") == 0) // no guardians left
{
GiveOrder_RunToTarget();
return;
};
if ( Ambushed
&& GetCommander("Convoy_Rank") == "" // we are commander in group
&& GetTargetedEnemy() == "") // and cannot see enemy in radar
{
// end ambush when commander see no enemy on radar
Core_BroadcastEvent("OnEndAmbush");
}
}
void OnAmbush()
{
if ( Run == true)
return;
if ( ! Ambushed)
{
//Core_LogMessage("--- Ambush!!!");
if ( GetGroupObjectsNum("Guard_Rank") > 0)
{
GiveOrder_Disperse();
}
}
}
void OnEndAmbush()
{
if ( Run == true)
return ;
//Core_LogMessage("=== EndAmbush!!!");
GiveOrder_MoveToTarget();
}
};
class CConvoyMission_SovietTank_ConvoyGuard extends CConvoyMission_SovietTruck_ConvoyTransport
{
//
// additional state for guardians
boolean Defend = false; // true when object is defending convoy
void ClearState()
{
Moving = false;
Ambushed = false;
Run = false;
Defend = false;
CurLeader = "";
IsLeader = false;
}
//
// events
void OnAmbush()
{
if ( ! Ambushed)
{
//Core_LogMessage("+++ Ambush!!!");
GiveOrder_AttackEnemy();
}
}
void GiveOrder_AttackEnemy()
{
//Core_LogMessage("" + Core_GetIdentificator() + ": order: line formation");
SetFireStyle_Nearest();
// set state
ClearState();
Defend = true;
Ambushed = true;
string NearestEnemy = GetTargetedEnemy();
if ( NearestEnemy == "")
NearestEnemy = GetNearestEnemyUnit_Ranged(1000.0);
if ( NearestEnemy != "")
{
SetAttackStyle_DirectMove( true);
SetOrder_Attack( NearestEnemy, 30.0, 120.0, 30.0);
SetFireStyle_Enemy( NearestEnemy);
};
};
};
//
// *** Ambushes
//
class CConvoyMission_NaziTank_Ambusher extends CBaseAITask_BaseTask
{
//
// start up initialization
void Init()
{
// give start order
SetFireStyle_NoFire();
}
void OnEnemyTargeted()
{
string EnemyID = GetTargetedEnemy();
SetFireStyle_Enemy( EnemyID);
}
void OnOrderedEnemyKilled()
{
string EnemyID = GetTargetedEnemy();
if ( EnemyID != "")
{
SetFireStyle_Enemy( EnemyID);
}
else
{
SetFireStyle_Nearest();
}
}
}
class CConvoyMission_NaziTank_Attacker extends CBaseAITask_BaseTask
{
//
// start up initialization
void Init()
{
// give start order
SetFireStyle_NoFire();
}
void OnEnemyTargeted()
{
string EnemyID = GetTargetedEnemy();
SetOrder_Attack( EnemyID, 100.0, 150.0, 12.0);
SetFireStyle_Enemy( EnemyID);
}
void OnOrderedEnemyKilled()
{
string EnemyID = GetTargetedEnemy();
if ( EnemyID != "")
{
SetOrder_Attack( EnemyID, 100.0, 150.0, 12.0);
SetFireStyle_Enemy( EnemyID);
}
else
{
SetFireStyle_Nearest();
}
}
}
class CConvoyMission_NaziTank_TransportKiller extends CBaseAITask_BaseTask
{
//
// current state
boolean AttackTruck = false;
//
// start up initialization
void Init()
{
// give start order
SetFireStyle_NoFire();
SetRadarRestrictions("Truck"); // attack only trucks
}
//
// events
void OnToDamage(
float _DamageRate,
string _TargetId,
string _SourceType,
matrix _SourcePlace)
{
SetRadarRestrictions(); // attack everybody
SetFireStyle_Nearest();
}
void OnEnemyTargeted()
{
string EnemyID = GetTargetedEnemy();
SetOrder_Attack( EnemyID, 100.0, 150.0, 12.0);
SetFireStyle_Enemy( EnemyID);
AttackTruck = true;
}
void OnOrderedEnemyKilled()
{
string EnemyID = GetTargetedEnemy();
if ( EnemyID != "")
{
SetOrder_Attack( EnemyID, 100.0, 150.0, 12.0);
SetFireStyle_Enemy( EnemyID);
AttackTruck = true;
}
else
{
SetFireStyle_Nearest();
}
}
}
//
// *** special attackers
//
class CConvoyMission_NaziTank_BackAttacker_1 extends CBaseAITask_BaseTask
{
//
// current state
boolean Attacking = false;
//
// start up initialization
void Init()
{
// give start order
SetFireStyle_NoFire();
}
void OnAttackConvoy_1()
{
if ( !Attacking)
{
Core_LogMessage("" + Core_GetIdentificator() + ": order: Attack Convoy");
string EnemyID = GetLastSlave("Convoy_Rank");
SetOrder_Attack( EnemyID, 100.0, 150.0, 55.0);
SetFireStyle_Enemy( EnemyID);
Attacking = true;
};
}
void OnOrderedEnemyKilled()
{
Core_LogMessage("" + Core_GetIdentificator() + ": order: ReAttack Convoy");
string EnemyID = GetLastSlave("Convoy_Rank");
if ( EnemyID != "")
{
SetOrder_Attack( EnemyID, 100.0, 150.0, 55.0);
SetFireStyle_Enemy( EnemyID);
}
else
{
SetFireStyle_Nearest();
}
}
}
class CConvoyMission_NaziTank_BackAttacker_2 extends CBaseAITask_BaseTask
{
//
// current state
boolean Attacking = false;
//
// start up initialization
void Init()
{
// give start order
SetFireStyle_NoFire();
}
void OnAttackConvoy_2()
{
if ( !Attacking)
{
Core_LogMessage("" + Core_GetIdentificator() + ": order: Attack Convoy");
string EnemyID = GetLastSlave("Convoy_Rank");
SetOrder_Attack( EnemyID, 100.0, 150.0, 55.0);
SetFireStyle_Enemy( EnemyID);
Attacking = true;
}
}
void OnOrderedEnemyKilled()
{
Core_LogMessage("" + Core_GetIdentificator() + ": order: ReAttack Convoy");
string EnemyID = GetLastSlave("Convoy_Rank");
if ( EnemyID != "")
{
SetOrder_Attack( EnemyID, 100.0, 150.0, 55.0);
SetFireStyle_Enemy( EnemyID);
}
else
{
SetFireStyle_Nearest();
}
}
}
class NaziPatrol_A extends CBaseAITask_Patrol, CNavPointUser
{
// void Init()
// {
// }
array GetPatrolTrip()
{
return array (GetNavPoint("NavPoint_Ambush_2"),
GetNavPoint("NavPoint_Ambush_1"));
}
float GetTripSpeed()
{
return 26;
}
}
class NaziPatrol_B extends CBaseAITask_Patrol, CNavPointUser
{
// void Init()
// {
// }
array GetPatrolTrip()
{
return array (vector(5377.0, 9814.0, 0.0),
GetNavPoint("NavPoint_Ambush_2"));
}
float GetTripSpeed()
{
return 26;
}
}
//==================================================================
class AttackPlatoon_A extends CBaseAITask_BaseTask, CNavPointUser
{
int StartTime = 0;
int CurrentTime = 0;
boolean Started = false;
final int TimeToStart = 220000;
void Attack_A()
{
StartTime = GetGameTime();
}
void OnUpdate()
{
CurrentTime = GetGameTime();
if( CurrentTime >= (StartTime+TimeToStart) && !Started && StartTime > 0 )
{
Started = true;
MoveToPointA();
// DoAttack();
// Core_LogMessage("Attack A has started. Time after convoy is "+(CurrentTime-StartTime));
}
}
void MoveToPointA()
{
SetOrder_MoveTo( GetNavPoint("NavPoint_PatrolA"), 26 );
}
void AttackTarget_A()
{
DoAttack();
}
void DoAttack()
{
string NearestEnemy = GetTargetedEnemy();
if ( NearestEnemy == "")
{
NearestEnemy = GetNearestEnemyUnit();
};
SetOrder_Attack( NearestEnemy, 100.0, 150.0, 27.0);
SetFireStyle_Enemy( NearestEnemy );
}
void OnOrderedEnemyKilled()
{
SetFireStyle_Nearest();
DoAttack();
}
}
//------------------------------------------------------------------
class AttackPlatoon_B extends CBaseAITask_BaseTask, CNavPointUser
{
int StartTime = 0;
int CurrentTime = 0;
boolean Started = false;
final int TimeToStart = 130000;
void Attack_B()
{
StartTime = GetGameTime();
}
void OnUpdate()
{
CurrentTime = GetGameTime();
if( CurrentTime >= (StartTime+TimeToStart) && !Started && StartTime > 0 )
{
Started = true;
MoveToPointB();
// DoAttack();
}
}
void MoveToPointB()
{
SetOrder_MoveTo( GetNavPoint("NavPoint_PatrolB"), 26 );
}
void AttackTarget_B()
{
DoAttack();
}
void DoAttack()
{
string NearestEnemy = GetTargetedEnemy();
if ( NearestEnemy == "")
{
NearestEnemy = GetNearestEnemyUnit();
};
SetOrder_Attack( NearestEnemy, 100.0, 150.0, 27.0);
SetFireStyle_Enemy( NearestEnemy );
}
void OnOrderedEnemyKilled()
{
SetFireStyle_Nearest();
DoAttack();
}
}